package com.itheima.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.bean.Category;
import com.itheima.bean.PageParam;
import com.itheima.bean.Setmeal;
import com.itheima.exception.CustomException;
import com.itheima.mapper.CategoryMapper;
import com.itheima.service.CategoryService;
import com.itheima.service.DishService;
import com.itheima.service.SetMealService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

@Service
@Transactional
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper cm;

    @Autowired
    private DishService ds;

    @Autowired
    private SetMealService ss;

    /**
     * 添加分类
     * @param category
     * @return
     */
    @Override
    public int add(Category category) {
        return cm.insert(category);
    }

    /**
     * 分页查询分类
     * @param pageParam
     * @return
     */
    @Override
    public IPage<Category> findPage(PageParam pageParam) {
        //1、创建条件对象
        LambdaQueryWrapper<Category> lqw = new LambdaQueryWrapper<>();

        //2、设置排序，按照排序就行升序条件           名字排序
        lqw.orderByAsc(Category::getSort , Category::getName);
        IPage<Category> page = new Page<>(pageParam.getPage(),pageParam.getPageSize());

        //按照整张表来进行分页查询，不进行任何的条件封装，所以第二个参数就写null
        return cm.selectPage(page,lqw);
    }

    /**
     * 删除分类
     *      1、分类不能直接删除，需要去判定有没有与之关联的菜品或者套餐
     *          1.1、去查询菜品表，看看这个表里面有没有什么菜品属于这种分类
     *          1.2、去查询套餐表，看看这个表里面有没有什么套餐属于这种分类
     *      2、这里之所以要去查询两张表是因为前端给过来的数据不够多，只有这个分类的id值
     *          2.1、根本不知道这个分类是哪一种分类。（比如现在要删除：湘菜，后端只会得到湘菜的分类的id值）
     * @param id
     * @return
     */
    @Override
    public int delete(long id) {
        //1、去查询一下菜品表里面有没有菜品与这个分类【菜品】有关系？
        long count = ds.findCountByCategoryId(id);
        if (count > 0){//存在菜品与这个分类关联的情况
            throw new CustomException("当前分类关联了菜品，禁止删除！");
        }
        //2、去查询一下套餐表，看看有什么子套餐属于这个分类【套餐】
        long count2 = ss.findCountByCategoryId(id);
        if (count2 > 0){//存在菜品与这个分类关联的情况
            throw new CustomException("当前分类关联了套餐，禁止删除！");
        }

        //执行分类的删除
        return cm.deleteById(id);
    }

    /**
     * 修改分类
     * @param category
     * @return
     */
    @Override
    public int update(Category category) {
        return cm.updateById(category);
    }

    /**
     * 按类型查找分类
     * @param type
     * @return
     */
    @Override
    public List<Category> findByType(int type) {
        LambdaQueryWrapper<Category> lqw = new LambdaQueryWrapper<>();
        lqw.eq(Category::getType,type);
        //追加排序设置，先按照sort来排序【升序】，然后按照更新时间来排序【倒序】
        lqw.orderByAsc(Category::getSort).orderByDesc(Category::getUpdateTime);

        return cm.selectList(lqw);
    }

    /**
     * 查询所有的分类
     * @return
     */
    @Override
    public List<Category> findAll() {
        return cm.selectList(null);
    }
}
